package ClasesBasicas;

import java.awt.Color;
import java.awt.GridLayout;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JProgressBar;
import javax.swing.UIManager;

import Enums.ColorFicha;
import GestionPartida.Casilla;

/**
 * @author Grupo 04
 * 
 *         Clase Contador, cuyo fin es realizar una cuenta atras y visualizarla
 *         como una barra de progreso con minutos y segundos.
 * 
 *         Esta clase no debe construirse usando un constructor directamente, en
 *         su lugar se puede usar el metodo estatico crearContador de la misma
 *         clase, de manera que se puedan especificar los colores de la barra de
 *         progreso.
 * 
 */
public class Contador extends JProgressBar implements Runnable {

	private int minutos, segundos;
	private boolean interrumpido;
	private Partida partida;

	/**
	 * Contructor para la clase Contador. Este metodo no puede ser usado fuera
	 * de la clase ya que no permite especificar los colores usados. En su lugar
	 * se usara el metodo crearContador de la clase.
	 * 
	 * @param seg
	 *            Segundos en la cuenta atras.
	 */
	private Contador(int seg, Partida p) {
		super(0, (seg));
		partida = p;
		minutos = seg / 60;
		if (minutos < 60) {
			segundos = seg % 60;
		} else {
			minutos = 59;
			segundos = 59;
		}
		interrumpido = false;
		setString(((minutos < 10) ? "0" + minutos : minutos) + ":"
				+ ((segundos < 10) ? "0" + segundos : segundos));
		setStringPainted(true);
		setBorder(BorderFactory.createLoweredBevelBorder());
		setVisible(false);
	}

	/**
	 * Interrumpe el contador
	 */
	public void interrumpir() {
		interrumpido = true;
	}

	/**
	 * Ejecuta el contador desde 0 en un hilo nuevo
	 */
	public void ejecutar() {
		interrumpido = false;
		Thread t = new Thread(this);
		t.start();
	}

	public void run() {
		setVisible(true);
		setValue(getMaximum());
		int mins = minutos;
		int segs = segundos;
		while ((mins != 0 || segs != 0) && !interrumpido) {
			if (segs == 0) {
				mins--;
			}
			segs = (segs > 0) ? segs - 1 : 59;
			setString(((mins < 10) ? "0" + mins : mins) + ":"
					+ ((segs < 10) ? "0" + segs : segs));
			setValue(mins * 60 + segs);
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				setValue(0);
				minutos = 0;
				segundos = 0;
			}
		}
		setValue(0);
		if (!interrumpido) {
			partida.siguienteTurno();
			for (int i = 0; i < partida.getTablero().getCasillas().length; i++) {
				for (Casilla c : partida.getTablero().getCasillas()[i]) {
					if (c.getFicha() == null
							&& c.getComponenteVisual().getIcono() != null) {
						c.getComponenteVisual().setIcono(null);
					}
				}
			}
		}
		setVisible(false);
	}

	/**
	 * Metodo estatico de la clase Contador que permite crear contadores
	 * especificando los colores del contador y el numero de segundos que
	 * contara.
	 * 
	 * Sustituye al constructor de la clase, ya que este es privado. La forma
	 * adecuada de usarlo seria siguiente: Contador miContador =
	 * Contador.crearContador(misSegundos, miColor1, miColor2, miColor3);
	 * 
	 * en lugar de:
	 * 
	 * Contador miContador = new Contador(misSegundos);
	 * 
	 * @param seg
	 *            Cantidad de segundos que habra en la cuenta atras.
	 * @param color
	 *            color del jugador al que pertenece el contador
	 * @param p
	 *            Partida que usara el contador
	 */
	public static Contador crearContador(int seg, ColorFicha color, Partida p) {

		UIManager.put("ProgressBar.selectionBackground", new Color(0, 0, 0));
		if (color == ColorFicha.Negro) {
			UIManager.put("ProgressBar.selectionForeground", new Color(255,
					255, 255));
		} else {
			UIManager
					.put("ProgressBar.selectionForeground", new Color(0, 0, 0));

		}
		UIManager.put("ProgressBar.foreground", color.getRepresentacion());
		return new Contador(seg, p);

	}
}